package com.ys.递归;

/**
 * 描述: 递归得定义:
 * <p>
 * 应该分为两部分:
 * 递归头: 出口 程序结束时
 * 递归体: 入口 什么时候开始递归
 * </p>
 * 结论:
 * 1 入口在前(程序执行顺序),出口在后
 * 2入口可以有多个,出口也可以有多个
 * 3有时,递归的入口与出口会再一起比较不明确
 * 4:递归开辟大量的栈帧,消耗大量资源,一般如果可以使用循环解决,就使用循环.除非使用循环无法解决
 *
 * @author CodeYang
 * @version 2020/12/23 16:00
 */
public class 递归基础 {

    public static void main(String[] args) {


        /**
         * 计算阶乘
         */
        System.out.println(factorial01(5));
        System.out.println(factorial02(5));
        /**
         * 计算斐波拉契数列
         */
        System.out.println(fibonacci01(5));
        System.out.println(fibonacci02(5));

    }



    /**
     * 递归: 出口与入口明确方式
     *
     * @param num
     * @return num的阶乘
     */
    static int factorial02(int num) {
        // 出口
        if (num == 1) {
            return 1;
        }
        //入口:
        //int sum = num * factorial02(num -1);
        //return sum;
        return num * factorial02(num - 1);

    }

    /**
     * 计算n的阶乘
     *
     * @param num
     * @return
     */
    public static int factorial01(int num) {
        return num == 1 ? 1 : num * factorial01(num - 1);
    }
    /**
     * 递归 明确
     * 递归头
     * 递归提体
     * 斐波拉契数列 n >3 f(n)= f(n-1)+ f(n-2)
     *
     * @param num
     * @return
     */
    private static int fibonacci02(int num) {
        if (num == 1 || num == 2){ return 1;}
        return fibonacci02(num - 1) + fibonacci02(num - 2);
    }

    /**
     * 计算斐波拉契数列
     * 斐波拉契数列 n >3 f(n)= f(n-1)+ f(n-2)
     *
     * @param num
     * @return
     */
    public static int fibonacci01(int num) {
        return num == 1 || num == 2 ? 1 : fibonacci01(num - 1) + fibonacci01(num - 2);
    }


}
